/*
 * @lc app=leetcode.cn id=283 lang=cpp
 *
 * [283] 移动零
 *
 * https://leetcode-cn.com/problems/move-zeroes/description/
 *
 * algorithms
 * Easy (63.99%)
 * Likes:    1483
 * Dislikes: 0
 * Total Accepted:    659.4K
 * Total Submissions: 1M
 * Testcase Example:  '[0,1,0,3,12]'
 *
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 * 
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * 
 * 
 * 
 * 示例 1:
 * 
 * 
 * 输入: nums = [0,1,0,3,12]
 * 输出: [1,3,12,0,0]
 * 
 * 
 * 示例 2:
 * 
 * 
 * 输入: nums = [0]
 * 输出: [0]
 * 
 * 
 * 
 * 提示:
 * 
 * 
 * 
 * 1 <= nums.length <= 10^4
 * -2^31 <= nums[i] <= 2^31 - 1
 * 
 * 
 * 
 * 
 * 进阶：你能尽量减少完成的操作次数吗？
 * 
 */

// @lc code=start
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        
        // int slowIndex = 0;
        // int nums0 = 0;
        // for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++){
        //     if(nums[fastIndex] != 0){
        //         // slowIndex++ --> 先slowIndex，再++，此时的slowIndex有慢半拍的意思
        //         nums[slowIndex++] = nums[fastIndex];
        //     }
        // }

        // nums0 = nums.size() - slowIndex;

        // for(int i = nums.size() - 1, j = 0; j < nums0; i--, j++){
        //     nums[i] = 0;
        // }

        //第二遍
        int slowIndex = 0, fastIndex = 0;
        for (; fastIndex < nums.size(); fastIndex++){
            if (nums[fastIndex]  != 0){
               nums[slowIndex++] = nums[fastIndex];               
            }
        }
        for (int i = slowIndex; i < nums.size(); i++){
            nums[i] = 0;
        }

        //直接交换
        // int slowIndex = 0;
        // for(int fastIndex = 0; fastIndex < nums.size(); fastIndex++){
        //     if(nums[fastIndex] != 0){
        //         // slowIndex++ --> 先slowIndex，再++，此时的slowIndex有慢半拍的意思
        //         swap(nums[slowIndex++], nums[fastIndex]);
        //     }
        // }

        
    }
};
// @lc code=end

